【精选】使用 Spring Native 毫秒级启动 SpringBoot 项目,并且大量减少占用的内存 您所在的位置:网站首页 springboot docker 内存 减少 【精选】使用 Spring Native 毫秒级启动 SpringBoot 项目,并且大量减少占用的内存

【精选】使用 Spring Native 毫秒级启动 SpringBoot 项目,并且大量减少占用的内存

2023-10-19 06:04| 来源: 网络整理| 查看: 265

Spring Native是什么

近几年“原生”一词一直泛滥在云计算、边缘计算等领域中,而原生宠幸的语言也一直都是Golang,Rust等脱离Sandbox运行的开发语言。Java得益于上世纪流行的一次编译,到处执行的理念,流行至今,但也因为这个原因,导致Java程序脱离不了JVM运行环境,使得不那么受原生程序的青睐。在云原生泛滥的今天,臃肿的JVM使Java应用程序对比其他语言显得无比的庞大,各路大神也想了很多方式让Java变的更“原生”。

Spring Native 为使用GraalVM 原生映像编译器将 Spring 应用程序编译为原生可执行文件提供 beta 支持,以提供通常设计为打包在轻量级容器中的原生部署选项。实际上,目标是在这个新平台上支持几乎未修改的 Spring Boot 应用程序。

配置环境 OS:Windows10 21H2 IDE:IntelliJ IDEA 2022.1.3 JDK:graalvm-ce-java11-22.2.0 Maven:3.5.4 Docker Desktop for Windows: 4.12.0 Spring Boot:2.7.4 Spring Native:0.12.1

使用 Spring Native 的应用程序应该使用 Java 11 或 Java 17 编译。

构建 Spring Boot 原生应用程序有两种主要方法:

使用Spring Boot Buildpacks 支持生成包含本机可执行文件的轻量级容器。

使用GraalVM 原生镜像 Maven 插件支持生成原生可执行文件。

方法1就是在SpringBoot2.3后,可以使用spring-boot-maven-plugin插件来构建docker镜像,使用mvn spring-boot:build-image命令结合Docker的API来实现Spring Boot 原生应用程序的构建,成功执行后会直接生成一个docker镜像,然后run这个镜像就可以了,不用我们再写Dockerfile了,相关的参数配置都在pom.xml中配置(该插件的configuration标签下,和fabric8或spotify的docker-maven-plugin很相似)。

方法2不需要安装docker,但要安装Visual Studio,然后执行mvn -Pnative package命令后会生成一个可执行文件(.exe),运行即可。

主要区别如下

1 环境依赖不同

方法1需要安装Docker

方法2需要安装Visual Studio(需要用到部分单个组件:2个MSVC,1个Windows 10 SDK)

2 执行的maven命令不同

方法1是mvn spring-boot:build-image

方法2是mvn -Pnative package

因为每个微服务使用Docker部署而不是exe文件,所以方法1正好符合我的需求,所以后文使用Spring Boot Buildpacks的方式构建Spring Boot原生应用程序。

安装Graal VM

官方下载地址:

https://www.graalvm.org/downloads/

e1e4a5a715ad14a018c37cc87674a110.png dd12adb61bdab3f7c88c316b3af0511e.png 配置环境变量 6e27f493e4e1a74bbdbb8efd9ef951f6.png c691e47527f533b33e74b3c13e1c3adf.png be30b5e0e4bfa85b1b623bdbec96f1ef.png

检验是否安装成功

99910e5ae9548bd770ba62bb64d28cac.png 安装native-image

打开新的cmd,输入以下命令,等待安装

gu install native-image 安装 Docker Desktop for Windows

具体步骤略,按照官方文档操作即可:https://docs.docker.com/desktop/windows/install/

创建Springboot项目 ca6260922c8f61e639ab45422dde7211.png 52feea9ba209e27db710c4c874120e2a.png

完整的pom如下

 4.0.0     org.springframework.boot   spring-boot-starter-parent   2.7.4        com.example  spring-native  0.0.1-SNAPSHOT  spring-native  spring-native     11      0.12.1           org.springframework.boot    spring-boot-starter-web          org.springframework.experimental    spring-native    ${spring-native.version}          org.projectlombok    lombok    true          org.springframework.boot    spring-boot-starter-test    test                   org.springframework.boot     spring-boot-maven-plugin                          org.projectlombok        lombok                   ${repackage.classifier}             paketobuildpacks/builder:tiny               true                 -Xms128m        -Xmx128m        -Xss256k        -XX:ParallelGCThreads=2        -XX:+PrintGCDetails                               org.springframework.experimental     spring-aot-maven-plugin     ${spring-native.version}                  test-generate               test-generate                          generate               generate                                    spring-releases    Spring Releases    https://repo.spring.io/release         false                  spring-releases    Spring Releases    https://repo.spring.io/release         false         

本文介绍的是Spring Native0.12.1版本,其对应的Spring Boot版本必须是2.7.4,以上只是一个最基本的配置案例,实际开发中还需要在spring-boot-maven-plugin插件的configuration标签下配置其他许许多多的参数。

例如docker远程的地址和证书的路径、jvm调优参数、配置文件指定、docker镜像名端口仓库地址等等,最好的方法就是看spring-boot-maven-plugin的官方文档,这里以配置jvm参数为例

82be5afeca08f0ab6cc6d6e4d75a90e5.png

配置官方文档:

https://docs.spring.io/spring-boot/docs/2.6.2/maven-plugin/reference/htmlsingle/#build-image

为了测试我这里配置Springboot项目端口为8888,并且添加了一个获取当前日期的API。推荐面试宝典:https://www.yoodb.com/

b338f432a55311fb52d6f2f04f579ba3.png 7e106f764080962bda932fb4b99a470c.png

执行maven命令

mvn clean mvn '-Dmaven.test.skip=true' spring-boot:build-image

下载完相关依赖后,电脑就会开始构建编译项目,查看任务管理器可以发现在构建和编译过程中CPU利用率很高,内存使用量也很高,根据电脑配置和网络状态不同使用的构建时间也不相同。

构建成功如下图:

08384fa620fe781f0bb4002dfe14c327.png

创建并运行容器

查看所有镜像docker images

9bd54ed84b9a23d0e7197326ab5c4cdd.png

spring-native就是构建的镜像

创建并运行容器

docker run -id -p 8888:8888 --name=native-app spring-native:0.0.1-SNAPSHOT 59178df9f49b

在Docker Desktop查看日志,发现应用成功启动,启动仅耗时31ms,果然印证了Spring Native启动是毫秒级别这句话。更多springboot系列教程:https://www.yoodb.com/spring/spring-ioc-architecture.html

0e5169cc0e5c836ef77486b63b341b5a.png

在Docker Desktop查看占用内存,仅46M左右。

4faac7f2a6719c28b00735ee3692a460.png

成功调用接口

889cb449ed4b095854469f8ee727df33.png

不使用Spring Native启动应用,使用java -jar来启动项目

4d89d4bc21ec304bd751223afc66ed0e.png b800d5fab9d8c80caf77f449984ab29b.png

启动耗时1.5秒,占用内存高达238M。

最后附上Spring Native官方文件:

https://docs.spring.io/spring-native/docs/current/reference/htmlsingle/index.html

作者:随遇而安ing

https://blog.csdn.net/qq_35156196/article/details/127208514

公众号“Java精选”所发表内容注明来源的,版权归原出处所有(无法查证版权的或者未注明出处的均来自网络,系转载,转载的目的在于传递更多信息,版权属于原作者。如有侵权,请联系,笔者会第一时间删除处理! 最近有很多人问,有没有读者交流群!加入方式很简单,公众号Java精选,回复“加群”,即可入群! Java精选面试题(微信小程序):3000+道面试题,包含Java基础、并发、JVM、线程、MQ系列、Redis、Spring系列、Elasticsearch、Docker、K8s、Flink、Spark、架构设计等,在线随时刷题! ------ 特别推荐 ------ 特别推荐:专注分享最前沿的技术与资讯,为弯道超车做好准备及各种开源项目与高效率软件的公众号,「大咖笔记」,专注挖掘好东西,非常值得大家关注。点击下方公众号卡片关注。 点击“阅读原文”,了解更多精彩内容!文章有帮助的话,点在看,转发吧!


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有